# QueryTransformer
Идея этого небольшого проекта возникла благодаря вот этой задачки от Яндекса:

"Программисту Василию нужно проанализировать, какие запросы больше всего нагружают SQL-сервер. Так как запросов в логе очень много, Василий хочет привести 
все SQL-запросы к канонической форме, чтобы можно было группировать запросы, отличающиеся только значениями параметров вызова.

Каноническая форма запроса определяется следующими правилами:

    1. Весь запрос должен состоять из одной строки в нижнем регистре.

    2. Все идущие подряд пробельные символы (whitespaces) должны быть схлопнуты в один пробел ’ ’ (без кавычек), при этом, после 
	открывающей круглой скобки ’(’ (без кавычек) и перед закрывающей круглой скобкой ’)’ (без кавычек) не должно быть даже одиночных пробелов. 
	Так же должны быть удалены все пробельные символы в конце запроса.

    3. Все значения параметров запроса должны быть заменены на символ знака вопроса ’?’ (без кавычек)

    4. Всё, что находится внутри скобок секции in (param1, param2 ... paramN) должно быть заменено на три точки ’...’ без кавычек.

Например, для запроса

SELECT
  id, name
FROM users
WHERE
  family = "Petrov" and
  (
    group_id = "1" or manager_id in ( "1", "3", "8" , "92" )
  );

Канонической формой будет
select id, name from users where family = ? and (group_id = ? or manager_id in (...));

Пока Василий занят настройкой аналитики в ClickHouse, он просит вас написать функцию, возвращающую каноническую форму запроса."

В процессе обдумывания решения пришла идея написать урезанную версию движка регулярных выражений. Когда-то давно я читал про реализацию
регулярных выражений в книге "Идеальный код". Понял, что уже ничего из прочитанного не помню. И решил, что было бы интересно придумать 
собственную реализацию, а потом сравнить с тем, что есть в книге. Тогда велик шанс, что в этом случае написанное надолго задержится 
в голове.

Проект создавался чисто как "proof on concept", в качестве упражнения.